package cn.zqy.demo.day11.demo03;


/**
 * 【匿名内部类】：内部类重点
 * 如果接口的实现类或者（父类的子类）只需使用唯一的一次，那么这种情况可使用匿名内部类。
 *
 * 匿名内部类：
 *      接口名 对象名 = new 接口名() {
 *          // 【必须覆盖重写所有】抽象方法
 *      };
 *
 *      对格式“new 接口名称() {...}”进行解析：
 * 1. new代表创建对象的动作
 * 2. 接口名称就是匿名内部类需要实现哪个接口
 * 3. {...}这才是匿名内部类的内容
 *
 * 另外还要注意几点问题：
 * 1. 匿名内部类，在【创建对象】的时候，只能使用唯一一次。
 * 如果希望多次创建对象，而且类的内容一样的话，那么就需要使用单独定义的实现类了。
 * 2. 匿名对象，在【调用方法】的时候，只能调用唯一一次。
 * 如果希望同一个对象，调用多次方法，那么必须给对象起个名字。
 * 3. 匿名内部类是省略了【实现类/子类名称】，但是匿名对象是省略了【对象名称】
 * 强调：匿名内部类和匿名对象不是一回事！！！
 *
 * * */
public class Demo05NoNameInnerClass {
    public static void main(String[] args) {

        // 使用匿名内部类
        Demo05Interface obj = new Demo05Interface() {
            @Override
            public void showc() {
                System.out.println("匿名内部类重写抽象方法");
            }
        };
         obj.showc();

        // 使用了匿名内部类，而且省略了对象名称，也是匿名对象

        new Demo05Interface() {
            @Override
            public void showc() {
                System.out.println("使用了匿名内部类，而且省略了对象名称");
            }
            public void ss() {
                System.out.println("sssssssss");
            }
        }.showc();

        // 因为匿名对象无法调用第二次方法，所以需要再创建一个匿名内部类的匿名对象

        new Demo05Interface() {
            @Override
            public void showc() {
                System.out.println("使用了匿名内部类，而且省略了对象名称");
            }
            public void ss() {
                System.out.println("sssssssss");
            }
        }.ss();
    }
}
